import java.util.*;

public class Kassa {
	private KassaRij kassarij;
	private int aantalArt;
	private double priceArt;	
	private double teBetalen;
	
	/**
	 * Constructor van de klasse Kassa.
	 */
	public Kassa( KassaRij kassarij ) {
		this.kassarij = kassarij; 
	}
	
	/**
	 * Deze methode vraagt het aantal artikelen en de totaalprijs op.
	 * @param persoon die moet afrekenen.
	 */
	public void rekenAf( Persoon persoon )  {
		Dienblad blad = persoon.getDienblad();
		Iterator<Artikel> artikelen = blad.getDienblad().iterator();
		//Maak een apparte variable aan om het te betalen bedrag van deze persoon bij te houden.
		teBetalen = 0;
		// Draait de while net zo lang totdat de hele inhoud is doorgelopen.
		while( artikelen.hasNext() ) { 
			// Haalt aantal artikelen op van Persoon.
			aantalArt++; 
			Artikel art = artikelen.next();
			priceArt += art.getArtikelPrijs();
			teBetalen += art.getArtikelPrijs();
		}
		
		//Set de betaalwijze
		persoon.setBetaalwijze( "contant" );
		//Kijk of de persoon een instancie is van Docent
		if( persoon instanceof Docent ) {
			//Zet de persoon om in een Docent
			Docent d = (Docent) persoon;
			//Bereken de korting
			double korting = teBetalen/d.geefKortingsPercentage();
			//Kijk of de persoon een max. heeft aan zijn kortingsbedrag
			if( d.heeftMaximum() ) {			
				//Kijk of de korting groter is dan de maximum korting
				if( korting > d.geefMaximum() ) {
					teBetalen -= d.geefMaximum();
					priceArt -= d.geefMaximum();					
				} else {
					teBetalen -= korting;
					priceArt -= korting;
				}
			} else {
				teBetalen -= korting;
				priceArt -= korting;
			}
		}
		//Kijk of de persoon een instancie is van Kantinemedewerker
		if( persoon instanceof Kantinemedewerker ) {
			//Zet de persoon om in een Kantinemedewerker
			Kantinemedewerker k = (Kantinemedewerker) persoon;
			//Bereken de korting
			double korting = teBetalen/k.geefKortingsPercentage();
			//Kijk of de persoon een max. heeft aan zijn kortingsbedrag
			if( k.heeftMaximum() ) {			
				//Kijk of de korting groter is dan de maximum korting
				if( korting > k.geefMaximum() ) {
					teBetalen -= k.geefMaximum();
				} else {
					teBetalen -= korting;
				}
			} else {
				teBetalen -= korting;
			}
		}
		
		try {
			persoon.getBetaalwijze().betaal( teBetalen );
		} catch (TeWeinigGeldException e) {
			System.out.println( persoon.getVoornaam() + persoon.getAchternaam() );
		}
		
	}
	
	/**
	 * Deze methode geeft het aantal artikelen weer dat de kassa is gepasseerd.
	 * @return aantal artikelen.
	 */
	public int aantalArtikelen() {
		return aantalArt;
	}
	
	/**
	 * Totaalbedrag van alles artikelen die de kasse hebben gepasseerd.
	 * @return hoeveelheid geld in kassa.
	 */
	public double hoeveelheidGeldInKassa() {
		return priceArt;
	}
	
	/**
	 * Reset de waarden van het aantal gepasseerde artikelen en de hoeveelheid geld in de kassa.
	 */
	public void resetKassa() {
		aantalArt = 0; 
		priceArt = 0; 
	}

}
